# hpgl.py
"""
HPGL (每克肝脏的肝细胞数量) 计算模块
"""
import math
from .variation_utils import apply_variation

def calculate_base_hpgl(age, hpgl_baseline, hpgl_age_coefficient):
    """
    计算基础HPGL值(无变异)
    
    公式: HPGL = 10^(age_coefficient*LOG(Age)+baseline)
    
    参数:
    age: 年龄(岁)
    hpgl_baseline: HPGL基准值
    hpgl_age_coefficient: 年龄对数项系数
    
    返回:
    基础HPGL值 (10^6 cells/g)
    """
    # 检查年龄是否有效 (必须为正数)
    if age <= 0:
        raise ValueError(f"年龄必须为正数: {age}")
    
    # 计算自然对数(ln)
    log_age = math.log(age)
    
    # 使用公式计算HPGL
    hpgl = 10 ** (hpgl_age_coefficient * log_age + hpgl_baseline)
    
    return hpgl

def calculate_hpgl(age, hpgl_baseline, hpgl_age_coefficient, hpgl_cv_lt20, hpgl_cv_gt20):
    """
    计算每克肝脏的肝细胞数量(HPGL)，包含变异
    
    参数:
    age: 年龄(岁)
    hpgl_baseline: HPGL基准值
    hpgl_age_coefficient: 年龄对数项系数
    hpgl_cv_lt20: 小于20岁的变异系数(%)
    hpgl_cv_gt20: 大于20岁的变异系数(%)
    
    返回:
    HPGL值 (10^6 cells/g)
    """
    # 获取基础HPGL值
    base_hpgl = calculate_base_hpgl(age, hpgl_baseline, hpgl_age_coefficient)
    
    # 根据年龄选择变异系数
    cv = hpgl_cv_lt20 if age < 20 else hpgl_cv_gt20
    
    # 应用变异
    return apply_variation(base_hpgl, cv)
